// 创建购物车的cart实例
export default {
	// 为当前模块开启命名空间
	namespaced: true,

	// 模块的 state 数据
	state: () => ({
		// 购物车的数组，用来存储购物车中每个商品的信息对象
		// 每个商品的信息对象，都包含如下 6 个属性：
		// { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
		/* 然后每次初始化的时候，都从本地拿数据 */
		cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
	}),

	// 模块的 mutations 方法，同步修改state中的数据
	mutations: {

		// 判断用户点击了是否添加购物车，如果是的话那么我们的购物车就判断是否包含这个商品信息，如果包含，则购物车数量加1，如果包含，则将这个商品信息添加到数组当中去
		addtocart(state, goods) {
			// 判断传递过来的商品ID是否包含在数组当中,find方法返回符合条件的数组成员
			const result = state.cart.find((x) => {
				return x.goods_id === goods.goods_id
			})
			// 判断
			// console.log(result);
			if (result) {
				// 为真，代表向购物车这个商品的数据加1
				result.goods_count++;
			} else {
				state.cart.push(goods)
			}
			console.log(state.cart)
			// 每次购物车数据发生变化都进行存储
			// this.commit('m_cart/saveCartGoods')
			// 通过 commit 方法，调用 m_cart 命名空间下的 saveToStorage 方法
			/* vuex的store分模块管理，需要在store的index.js中引入各个模块，为了解决不同模块命名冲突的问题，将不同模块的
			namespaced:true，之后再不同的页面引入的时候需要加上模块名访问*/
			this.commit('m_cart/saveCartGoods');
		},
		// 持久化存储购物车的数据
		saveCartGoods(state) {
			// 将存放商品信息的数组放到本地持久化
			uni.setStorageSync('cart', JSON.stringify(state.cart));
		},
		// 修改vuex当中goods的状态
		updateCartState(state, options) {
			// 首先判断能不能在购物车这个数组当中找到点击的那个商品
			const result = state.cart.find((item) => {
				return item.goods_id == options.goods_id
			})
			if (result) {
				result.goods_state = options.goods_state
			}
			// 购物车中商品的状态发生改变，就立即存储到本地，因为购物车会从本地拿数据
			this.commit('m_cart/saveCartGoods');
		},
		// 修改vuex中商品的数量
		updateCartNum(state, options) {
			// 首先判断能不能找到这个数组
			const result = state.cart.find((item) => {
				return item.goods_id == options.goods_id
			})
			if (result) {
				result.goods_count = options.goods_count * 1
			}
			// 每次更新后，更新本地数据
			this.commit('m_cart/saveCartGoods');
		},
		// 右滑删除购物车数据
		deleteCartGoods(state, options) {
			// 过滤满足条件的数组编程一个新数组，存储没有被删除的值
			state.cart = state.cart.filter((item) => {
				return item.goods_id != options.goods_id
			})
			// 每次更新后，更新本地数据
			this.commit('m_cart/saveCartGoods');
		},
		// 全选反选修改商品状态
		updateGoodsAllState(state,options){
			// 将新值赋值给所有商品
			state.cart.forEach((item)=>{
				item.goods_state = options
			});
			// 修改数据之后存储再本地
			this.commit('m_cart/saveCartGoods');
		}
	},

	// 模块的 getters 属性
	getters: {
		// 统计购物车总得商品数据，将这个数量放在购物车的徽标当中，方法默认有两个参数，第二个参数时state属性，第二个表示可以方位其他的getters对象
		total(state) {
			// 使用reduce方法改造数据求和的方法
			// let sum = 0;
			// state.cart.forEach((item) => {
			// 	sum += item.goods_count
			// })
			// return sum;
			return state.cart.reduce((prev,item)=>{
				return prev+item.goods_count
			},0)
		},
		// 统计用户购物车选中的商品
		checkedCount(state) {
			// 筛选出已选出的商品信息
			const res = state.cart.filter((item) => {
				return item.goods_state
			}).reduce((prev,cur)=>{
				return prev+cur.goods_count
			},0)
			// console.log(res);
			return res
		},
		// 统计选中商品价格的商品总数
		countStateTruePrice(state){
			return state.cart.filter((item)=>{
				return item.goods_state
			}).reduce((prev,cur)=>{
				// console.log(prev,cur.goods_price)
				return prev+= cur.goods_count * cur.goods_price
			},0).toFixed(2)
		}
	},
}
